import ast
import logging

from PySide6.QtCore import QObject, Signal


class 解析信号(QObject):
    解析完成 = Signal()


from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 节点模型匹配器
import time

# 配置日志记录器
logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

class AST解析器:
    def __init__(self, ast节点, 节点模型管理器=None):
        self.节点模型管理器 = 节点模型管理器
        self.ast节点 = ast节点
        self.信号 = 解析信号()
        self.调试模式 = False  # 是否开启调试模式
        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志

        日志记录器.info("AST解析器已初始化")

    def 开始解析(self):
        开始时间 = time.time()  # 记录开始时间

        节点类名 = self.ast节点.__class__.__name__
        if isinstance(self.ast节点, ast.AST) or 节点类名 == "list":
            self.ast节点遍历创建(self.ast节点, 节点模型管理器=self.节点模型管理器)
        else:
            日志记录器.warning("AST解析器：未知节点类型: %s", 节点类名)

        结束时间 = time.time()  # 记录结束时间
        运行时间 = 结束时间 - 开始时间  # 计算运行时间
        日志记录器.info("AST解析器：解析完成，运行时间: %.4f 秒", 运行时间)
        日志记录器.info("解析完成当前解析的ast节点为：%s", self.ast节点)
        self.信号.解析完成.emit()

    def ast节点遍历创建(self, ast节点, 节点模型管理器=None):
        当前节点 = None
        if isinstance(ast节点, ast.AST):
            当前节点 = 节点模型匹配器(ast节点, 节点模型管理器)
            if 当前节点:  # 如果当前节点创建成功
                日志记录器.debug("节点创建成功: %s", 当前节点)
                return 当前节点
            else:
                节点类名 = ast节点.__class__
                日志记录器.error("未匹配到节点映射: %s", 节点类名)
        elif isinstance(ast节点, list):
            # 如果是列表，说明是容器节点内部 当前节点类型必然是类或者函数
            for 索引, 列表元素 in enumerate(ast节点):
                self.ast节点遍历创建(列表元素, 节点模型管理器)

        return 当前节点

def 处理孤立子图(节点管理器):
    日志记录器.info("开始处理孤立子图")
    节点管理器.刷新控制流显示()
    节点管理器.自动布局()
    起始节点列表 = 节点管理器.节点布局管理器.获取所有独立子图的起始节点()
    起始节点列表长度 = len(起始节点列表)
    日志记录器.debug("起始节点列表长度: %d", 起始节点列表长度)

    if 起始节点列表长度 > 1:
        for 起始节点ID in 起始节点列表:
            命中ID个数 = 0
            for 节点 in 节点管理器.节点模型列表:
                if str(节点._节点ID) == 起始节点ID:
                    命中ID个数 += 1
                    if 节点.节点ast类型 == "类节点" or 节点.节点ast类型 == "函数节点":
                        起始节点列表长度 -= 1
                    else:
                        节点._是控制节点 = True
        if 起始节点列表长度 > 1:
            处理孤立子图(节点管理器)
        else:
            节点管理器.刷新控制流显示()
            节点管理器.自动布局()
            日志记录器.info("孤立子图处理完成")
